release: gate every extension on its own component round - #49
Open
weilueluo wants to merge 2 commits into
Open
Conversation
Extension defects only surfaced at the platform level because nothing in this repository ever instantiated a built component: the package tests exercise plain JS modules, so an opaque Wasm trap, a forwarded null sampling field, a dropped sealed instruction and a `list<u8>` the guest does not recognise were all reachable only from a tagged deployment. Each package now drives its actual `.component.wasm` through a realistic round on Brain's own `component-host` worker, at the immutable Brain revision the AWS MicroVM runtime already pins, and asserts that a failing export reaches the kernel as a typed `extension-error` carrying its reason. Staging fans out per package in an order derived from the release itself, each staged version is smoked from the registry rather than rebuilt, and promotion moves each package on its own receipt for that exact archive.
Contributor
Author
|
Run unchanged against the builds actually published to npm, the smoke rejects every one that shipped a defect and accepts only the current one:
Reverting the remaining two fixes in the working tree and rebuilding reproduces the other two, including the exact production symptom: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every one of this release's extension defects was found in a full tagged deployment plus an eight-case live canary, and every one was reachable far earlier: a Model export threw a plain
Errorand reached the kernel as a bare Wasm backtrace,temperature: nullwas forwarded to the provider, the OpenAI dialect never readgeneration.system_prompt, and the SSE decoder rejected every chunk because a hostlist<u8>does not arrive as aUint8Array. All four are only reachable when the real componentized Wasm runs against the real host ABI, which nothing here did — the package tests exerciseprovider.mjsandindex.mjsas plain modules.Per-extension end-to-end smoke
tools/component-smoke.mjsdrives one package's actual built components through a realistic round on Brain's owncomponent-hostworker, at the immutable Brain revisionpackages/env-aws-microvm/runtime/Cargo.tomlalready pins. That worker is a complete JSON-lines host over stdio with a capability seam, so the smoke needs no second host implementation and no Rust in this repository —.github/actions/component-hostbuilds and caches the binary by that revision.start→observewith a 2xx first chunk, a second chunk whose status is absent, thendone→acknowledge; then a 500 first chunksession_startwith a hydration tail, then amessageactivation drivingmodel_stream/journal_append/turn_finish; then a refused roundresolve→submitwith a bundle →observerunning →observecompleted →acknowledge→release; then a refused dispatchinvokeunder its declared grant against the package's own descriptor and bundle; then a refused grantEach kind asserts that a failing export surfaces a typed
extension-errorcarrying its reason, never a trap.@aexhq/modeland@aexhq/agentlooppublish no component, so their smoke compiles a fixture through the package's own public authoring path and drives that.Reverting each of the four fixes and rebuilding shows the smoke catches all four, including the exact production symptom for the first:
Per-package staging and promotion
npm-publish.ymlpacked and published all nine workspaces as one lot. Nowtools/npm-release.mjsrecords each package's intra-release edges in the manifest and derives the staging waves from them — no list to maintain, and a chain deeper than two waves fails closed rather than publishing a dependent before its dependency is visible. Staging fans out per package (@aexhq/modelbefore@aexhq/model-openai,@aexhq/agentloopbefore the loops), each staged version is installed from the registry and smoked against its exactdist.integrity, and promotion moves each package on its own receipt for that exact archive, holding an unproven one onnextinstead of blocking the rest.Every existing gate is unchanged: the
release/sha-<40hex>tag andexpected_commitcheck, the released-version integrity rule, the version-ownership source rule, thestage_run_idpromotion consumes, and exact cross-release dependency verification. No package version changes and no file underpackages/is touched.